package leetcode.year2021.month10;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class _08_02ThreeSum15 {
  public List<List<Integer>> threeSum(int[] nums) {
    ArrayList<List<Integer>> result = new ArrayList<>();
    Arrays.sort(nums);
    int n = nums.length;
    if (n < 3 || nums[0] > 0 || nums[n-1] < 0){
      return result;
    }
    for (int i = 0; i < n; i++) {
      if (nums[i] > 0){
        return result;
      }
      if(i > 0 && nums[i] == nums[i-1]) continue;
      int L = i+1;
      int R = n-1;
      while (L < R){
        if (nums[R] < 0){
          break;
        }
        int sum = nums[i] + nums[L] + nums[R];
        if (sum == 0) {
          while(L<R && nums[R] == nums[R-1]) R--;
          while(L<R && nums[L] == nums[L+1]) L++;
          result.add(Arrays.asList(nums[i],nums[L],nums[R]));
          L++;
          R--;
        }else if (sum > 0) {
          R--;
        } else {
          L++;
        }
      }
    }
    return result;

    /**
     *         List<List<Integer>> ans = new ArrayList();
     *         if (nums.length < 3){
     *             return ans;
     *         }
     *         Arrays.sort(nums);
     *         for (int i = 0; i < nums.length; i++){
     *             if (nums[i] > 0){
     *                 return ans;
     *             };
     *             if(i > 0 && nums[i] == nums[i-1]) continue;
     *             int L = i+1;
     *             int R = nums.length-1;
     *             while(L<R){
     *                 int sum = nums[i]+nums[L]+nums[R];
     *                 if(sum == 0){
     *                     while(L<R && nums[R] == nums[R-1]) R--;
     *                     while(L<R && nums[L] == nums[L+1]) L++;
     *                     ans.add(Arrays.asList(nums[i],nums[L],nums[R]));
     *                     L++;
     *                     R--;
     *                 } else if(sum > 0){
     *                     R--;
     *                 } else if(sum < 0){
     *                     L++;
     *                 };
     *             }
     *         }
     *         return ans;
     */
  }
  /**
   * 给你一个包含 n 个整数的数组 nums，判断 nums 中是否存在三个元素 a，b，c ，使得 a + b + c = 0 ？请你找出所有和为 0 且不重复的三元组。
   *
   * 注意：答案中不可以包含重复的三元组。
   *
   * 示例 1：
   *
   * 输入：nums = [-1,0,1,2,-1,-4]
   * 输出：[[-1,-1,2],[-1,0,1]]
   * 示例 2：
   *
   * 输入：nums = []
   * 输出：[]
   * 示例 3：
   *
   * 输入：nums = [0]
   * 输出：[]
   *
   */
}
